﻿/*C++命名空间*/
#include"namespace-1or2.h"
//C++中引用namespace来解决命名冲突
//int rand = 10;报错：“rand” : 重定义；以前的定义是“函数”
//命名域只能在全局定义
namespace wz {
	//命名域命名域中可以定义函数，变量，类型
	int rand = 10;

	int Add(int a, int b) {
		int sum = a + b;
		return sum;
	}

	struct listNode {
		struct listNode* next;
		int val;
	};
	//命名域本质是一个新的域，和全局域各自独立，不同的域可以定义相同的变量，同一个域不能定义相同的变量
	//相比与局部域和全局域，命名域不影响成员的生命周期
}
//C++的标准库都放在一个std的命名空间中

//命名域还可以嵌套
namespace wz_2 {
	namespace a {
		int rand = 1;

		int Add(int a, int b) {
			int sum = a + b;
			return sum;
		}

		struct listNode {
			struct listNode* next;
			int val;
		};
	}
	namespace b {
		int rand = 0;

		int Add(int a, int b) {
			int sum = a + b;
			return sum;
		}

		struct listNode {
			struct listNode* next;
			int val;
		};
	}
	//命名空间的嵌套主要用于解决同一个命名空间中要使用相同的成员名称
}
namespace wz_3 {
	int a = 99;
	int b = 100;
}
void test02() {
	printf("%d\n", wz_2::a::rand);
	printf("%d\n", wz_2::b::rand);
}
//78FEF070
//10
void test01() {
	printf("%p\n", rand);
	printf("%d\n", wz::rand);
}
//1
//0
void test03() {
	wz_3::ST s;
	wz_3::STInit(&s, 1);
	wz_3::STPush(&s, 1);
	wz_3::STPush(&s, 2);
	wz_3::STPush(&s, 3);
	wz_3::STPush(&s, 4);
	for (int i = 0; i < s.top; i++) {
		printf("%d ", s.a[i]);
	}
	printf("\n");
}
//由test3可以看出不同文件下的相同名称的命名空间（wz_3）被视为是同一个域


using wz_3::b;//展开命名空间中部分成员
//using namespace wz_3;展开命名空间中全部成员
void test04() {
	//编译查找一个变量的声明/定义时，先在局部查找，再从全局查找
	//因此正常情况下推荐使用指定命名空间访问查找
	//除此之外，还可以展开命名空间
	printf("%d\n", wz_3::a);
	printf("%d\n", b);
}
/*int main() {
	//test01();
	//test02();
	//test03();
	test04();
	return 0;
}*/
